//
//  YHNetworkTool.swift
//  XLWB
//
//  Created by key on 16/6/26.
//  Copyright © 2016年 apple. All rights reserved.
//

import UIKit
import AFNetworking

//请求成功 和 失败 闭包重命名
typealias successClosure = (request: AnyObject?) -> ()
typealias failureClosure = (error: NSError?) -> ()

//定义枚举判断是一什么方式请求数据的
enum MethodType : String {
    
    case GET = "GET"
    
    case POST = "POST"
    
}

class YHNetworkTool: AFHTTPSessionManager {

    //MARK: - 单例实现  获取对象
    static let sharedTool: YHNetworkTool = {
        
        let net = YHNetworkTool()
        
        net.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        return net
    }()
    
    
    //MARK: - 网络请求方法
    func request(methodType: MethodType, URLString: String, parameters: AnyObject?, success: successClosure, failure: failureClosure) {
     
        if methodType == .POST {
        
            self.POST(URLString, parameters: parameters, progress: nil, success: { (_, res) -> Void in
                
                    //调用闭包 传递数据
                    success(request: res)

                }, failure: { (_, error) -> Void in
                    
                    //调用闭包 传递错误信息
                    failure(error: error)
                    print(error)
            })
            
        }else {
            
           self.GET(URLString, parameters: parameters, progress: nil, success: { (_, ret) -> Void in
            
                //调用闭包 传递数据
                success(request: ret)
            
            }, failure: { (_, error) -> Void in
                
                //调用闭包 传递错误信息
                failure(error: error)
           })

        }
        
    }
    
}


//MARK: - 分类实现网络请求 数据的获取
extension YHNetworkTool {
    
    
    //MARK: - 网络请求 获取access_token
    /*
    HTTP请求方式
    POST
    请求参数
    client_id	true	string	申请应用时分配的AppKey。
    client_secret	true	string	申请应用时分配的AppSecret。
    grant_type	true	string	请求的类型，填写authorization_code
    code	true	string	调用authorize获得的code值。
    redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致。
    
    返回值字段	字段类型	字段说明
    access_token	string	用户授权的唯一票据
    expires_in	string	access_token的生命周期，单位是秒数。
    uid	string	授权用户的UID，本字段只是为了方便开发者，减少一次user/show接口调用而返回的，第三方应用不能用此字段作为用户登录状态的识别，只有access_token才是用户授权的唯一票据。
    */
    func oauthLoadUserAccount(code: String, success: successClosure, failure: failureClosure) {
        
        //url  https://api.weibo.com/oauth2/access_token
        let urlString = "https://api.weibo.com/oauth2/access_token"
        
        //传递的参数
        let parameter = ["client_id": APPKEY, "client_secret": APPSECRET, "grant_type": "authorization_code", "code":code, "redirect_uri":REDIRECT_URI]
        
        //请求 建立连接 获取数据
        request(MethodType.POST, URLString: urlString, parameters: parameter, success: success, failure: failure)
        
    }
    

    
    
    


    //MARK: - 方法实现 请求个人信息
    /*
    
    access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
    uid	false	int64	需要查询的用户ID。
    
    */
    func oauthLoadUserInfo(userAccount: YHAccountModel, success: successClosure, failure: failureClosure) {
        
        //url  https://api.weibo.com/2/users/show.json
        let urlString = "https://api.weibo.com/2/users/show.json"
        
        //传递的参数
        let parameter = ["access_token": userAccount.access_token!, "uid": userAccount.uid!]
        
        
        //请求 建立连接 获取数据
        self.request(MethodType.GET, URLString: urlString, parameters: parameter, success: success, failure: failure)
        
    }
    
    
    //MARK: - 请求首页数据
    /*
        since_id	false	int64	若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
        max_id	false	int64	若指定此参数，则返回ID小于或等于max_id的微博，默认为0。
    */
    func loadHomeList(since_id: Int64, max_id: Int64, success: successClosure, failure: failureClosure) {
        
        //url
        let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
        
        //参数
        let parameter = ["since_id": "\(since_id)",
                         "max_id": "\(max_id)",
                         "access_token": YHUserAccountTool.sharedUserAccountTool.accessToken ?? ""
                        ]
        
//        print(since_id)
//        print(max_id)
//        print(YHUserAccountTool.sharedUserAccountTool.accessToken)

        //请求 建立连接 获取数据
        request(MethodType.GET, URLString: urlString, parameters: parameter, success: success, failure: failure)
        
        
    }
    
    
    
    //MARK: - 发送反馈
    func composeUpData(status: String, success: successClosure, failure: failureClosure) {
        
        // url
        let urlString = "https://api.weibo.com/2/statuses/update.json"
        
        // 请求参数
        let parameter = [
            "access_token": YHUserAccountTool.sharedUserAccountTool.accessToken!,
            "status": status
        ]
     
        //请求 建立连接 获取数据
        request(MethodType.POST, URLString: urlString, parameters: parameter, success: success, failure: failure)
        
    }
    
    //MARK: - 发送带图片的反馈
    func composeUpDataWithImage(status: String, imageList: [UIImage], success: successClosure, failure: failureClosure) {
        
        //url
        let url = "https://upload.api.weibo.com/2/statuses/upload.json"
        
        
        //请求参数
        let parameter = [
                        "access_token": YHUserAccountTool.sharedUserAccountTool.accessToken!,
                        "status": status
                        ]
        
        //发送请求
        POST(url, parameters: parameter, constructingBodyWithBlock: { (formData) -> Void in
            
            for image in imageList {
                
                let imgData = UIImagePNGRepresentation(image)
                
                formData.appendPartWithFileData(imgData!, name: "pic", fileName: "0000", mimeType: "application/octet-stream")
            
            }
            
            }, progress: nil, success: { (request, res) -> Void in
            
            //成功
            success(request: res)
            
            }) { (_, error) -> Void in
                
                //失败
                failure(error: error)
        }
        
        
    }
    
    
}














